// dva是配置开启
// 只要在任意页面创建model文件夹，并且创建model.ts文件

// 从umi里解构了4个ts的数据类型
import { Effect, ImmerReducer, Reducer, Subscription } from 'umi';

import { ratedApi } from '@/api/movies';

export interface IndexModelState {
  count: number;
  list: any[];
}

export interface IndexModelType {
  // 如果一个变量是字符串，而且一定不会改变，可以直接将这个字符串作为类型
  namespace: 'index';
  state: IndexModelState;
  effects: {
    // query: Effect;
    load: Effect;
  };
  reducers: {
    add: Reducer;
    load2: Reducer;
    // save: Reducer<IndexModelState>;
    // 启用 immer 之后
    // save: ImmerReducer<IndexModelState>;
  };
  subscriptions: { setup: Subscription };
}

// IndexModel就是小仓库实例
const IndexModel: IndexModelType = {
  // 命名空间, 模块名称
  namespace: 'index',

  // 仓库数据
  state: {
    count: 10,
    list: [],
  },

  // 仓库里面的异步方法
  // dva内置了redux-saga中间件
  effects: {
    // *query({ payload }, { call, put }) {},

    *load({ payload }, { call, put }) {
      const res = yield call(ratedApi);
      // console.log(res);
      yield put({ type: 'load2', res: res });
    },
  },

  // 用于改变state的同步方法
  reducers: {
    add(state, action) {
      return {
        ...state,
        count: state.count + 1,
      };
    },
    load2(state, action) {
      // console.log(action.res.result);

      return {
        ...state,
        list: action.res.result,
      };
    },
    // save(state, action) {
    //   return {
    //     ...state,
    //     ...action.payload,
    //   };
    // },
    // 启用 immer 之后
    // save(state, action) {
    //   state.name = action.payload;
    // },
  },

  // 用于做url监听的
  subscriptions: {
    // 这个函数会自动调用
    setup({ dispatch, history }) {
      return history.listen(({ pathname }) => {
        // console.log(pathname);

        // if (pathname === '/') {
        //   dispatch({
        //     type: 'query',
        //   });
        // }

        if (pathname === '/dva') {
          dispatch({
            type: 'load',
          });
        }
      });
    },
  },
};

export default IndexModel;
